package com.sunny.springboot2.controller;

import com.google.common.collect.Lists;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Controller;
import org.springframework.util.Base64Utils;
import org.springframework.util.FileCopyUtils;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;

import java.io.File;
import java.io.IOException;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * 文件上传controller
 * @author sunny
 * @date 2018/11/29
 */
@Controller
@RequestMapping("/noPer/upload")
public class FileUploadController {

    private static final Logger logger = LoggerFactory.getLogger(FileUploadController.class);

    /**
     * 跳转上传页面
     *
     * @author sunny
     * @date 2018/11/29
     * @return java.lang.String
     */
    @GetMapping("/index")
    public String index() {
        return "/index";
    }

    /**
     * 单文件上传
     *
     * @param file 文件
     * @author sunny
     * @date 2018/11/29
     * @return java.util.Map<java.lang.String,java.lang.String>
     */
    @PostMapping("/upload1")
    @ResponseBody
    public Map<String, String> upload1(@RequestParam("file") MultipartFile file) throws IOException {
        logger.info("[文件类型] - [{}]", file.getContentType());
        logger.info("[文件名称] - [{}]", file.getName());
        logger.info("[文件大小] - [{}]", file.getSize());

        //将文件写入指定目录（具体开发中可能是将文件写到云存储/或者指定目录通过 Nginx 进行 gzip 压缩和反向代理，此处只是为了演示故将地址写成本地电脑指定目录）
        file.transferTo(new File("/Users/sunny/Desktop/" + Math.random() + file.getOriginalFilename()));

        Map<String, String> result = new HashMap<>(16);
        result.put("contentType", file.getContentType());
        result.put("fileName", file.getName());
        result.put("fileSize", file.getSize() + "");
        return result;
    }

    /**
     * 多文件上传
     *
     * @param files 文件列表
     * @author sunny
     * @date 2018/11/29
     * @return java.util.List<java.util.Map<java.lang.String,java.lang.String>>
     */
    @PostMapping("/upload2")
    @ResponseBody
    public List<Map<String, String>> upload2(@RequestParam("file") MultipartFile[] files) throws IOException {
        if (files == null || files.length <= 0) {
            return null;
        }

        List<Map<String, String>> list = Lists.newArrayList();
        for (MultipartFile file : files) {
            //Spring Mvc 提供对写入方式
            file.transferTo(new File("/Users/sunny/Desktop/" + Math.random() + file.getOriginalFilename()));

            Map<String, String> result = new HashMap<>(16);
            result.put("contentType", file.getContentType());
            result.put("fileName", file.getName());
            result.put("fileSize", file.getSize() + "");
            list.add(result);
        }
        return list;
    }

    /**
     * BASE64方式上传文件
     *
     * @param base64 文件
     * @author sunny
     * @date 2018/11/29
     * @return void
     */
    @PostMapping("/upload3")
    @ResponseBody
    public void upload3(String base64) throws IOException {
        //BASE64 方式对格式和名字需要自己控制（如：PNG 图片编码后前缀就会是 data:image/png;base64,）
        final File file = new File("/Users/sunny/Desktop/" + Math.random() + "base64.jpg");
        //防止有对传了 data:image/png;base64, 有的没传的情况
        String[] strs = base64.split("base64,");
        final byte[] bytes = Base64Utils.decodeFromString(strs.length > 1 ? strs[1] : strs[0]);
        FileCopyUtils.copy(bytes, file);
    }
}
